#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


/*****************************************
**  Zone de déclaration des constantes  **
*****************************************/
#define Fic_Regles "Regles"	//a modifier si besoin
#define Fic_Faits "Faits"	//a modifier si besoin	
#define MAXSIZE 20
#define False 0
#define True 1
	

/*****************************************
**  Zone de déclaration des Prototypes  **
*****************************************/
char menu(void);
FILE* OuvrirFic(char* NomFic,char* mode);
void FermerFichier(FILE* fp);
//-- News -----------
void ConfigurerPartie(char indic);
int EditerConfig(void);
int ReinitConfigDefaut(void);
int ClonnageFaits(char indic);
void ConfigFailSolver(char indic);


/**************************
**  Programme principal  **
**************************/
int main(void)
{
	char choix=0;
	
  	do 
	{ 
		choix = menu();
		switch (choix)
		{
			case '0' : /* Quitter */
				
				ConfigurerPartie('R');
				printf("Deconnexion...\n");
				break;
				
			case '1' : /* Config */
				
				printf("Config\n\n");
				ConfigurerPartie('C');
				break;
			
			case '2' : /* Test */
				
				printf("Tester Fonction\n\n");
				ConfigFailSolver('R');
				break;
				
			default : 
				printf("\nErreur choix invalide\n");
		}
	} while(choix != '0');
   return 0;
}


/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/


/*************************************************************************
**  [ConfigurerPartie]                                                  **
**  Permet d'editer les faits pour configurer la partie et ses          **
**  parametres (nb IA, niveau de difficulte par exemple)                **
**                                                                      **
**      Entrees : CHAR                                                  **
**                'C' pour configurer                                   **
**                'R' pour reinitialiser                                **
**                                                                      **
**      Sorties : /                                                     **
**                                                                      **
**************************************************************************/
void ConfigurerPartie(char indic)
{
	int retour=0;
	FILE *fp=NULL;
	if(indic=='C' || indic=='c')
	{
		retour=EditerConfig();
		if(retour==0)
		{
			printf("Erreur de configuration des faits (aucun fich. de faits ?) ...");
			printf("Retablissement de la config par defaut\n");
			if((fp=fopen("Faits","r")))
			{
				fclose(fp);
				ConfigFailSolver('R');
			}
			else
				ConfigFailSolver('C');
		}
	}
	else if(indic=='R' || indic=='r')
	{
		if((fp=fopen("Faits.SAVE","r")))
		{
			retour=ReinitConfigDefaut();
			if(retour==0)
			{
				printf("Erreur de reinitialisation de la configuration ...");
				printf("Retablissement de la config par defaut\n");
				if((fp=fopen("Faits","r")))
				{
					fclose(fp);
					ConfigFailSolver('R');
				}
				else
					ConfigFailSolver('C');
			}
		}
	}
}

/*************************************************************************
**  [EditerConfig]                                                      **
**  Permet de dupliquer le fichier de faits afin de pouvoir le          **
**  modifier pour configurer la partie (nb IA, difficulte, ...)         **
**                                                                      **
**      Entrees : /                                                     **
**                                                                      **
**      Sorties : INT                                                   **
**                0 = echec                                             **
**                1 = succes                                            **
**                                                                      **
**************************************************************************/
int EditerConfig(void)
{
	FILE *fp=NULL;
	int retour=0;
	int nb=0;
	char str[MAXSIZE];
	memset(str,0,MAXSIZE*sizeof(char));
	
	retour=ClonnageFaits('C');
	if(retour==1)
	{
		fp=OuvrirFic(Fic_Faits,"w+"); //écrasé lors de l'ouverture
		if(fp!=NULL)
		{
			while(nb<1 || nb>3)
			{
				printf("Combien d'IA voulez vous affronter (entre 1 et 3) : ");
				scanf("%d",&nb);
				getchar();	
			}
			printf(" >Vous avez choisis %d adversaires\n",nb);
			strcpy(str,"Nb_J1;\r\n");
			fwrite(str,(int)strlen(str),1,fp);
			switch(nb)
			{
				case 1 : strcpy(str,"Nb_IA1;\r\n");
					 break;
				case 2 : strcpy(str,"Nb_IA2;\r\n");
					 break;
				case 3 : strcpy(str,"Nb_IA3;\r\n");
					 break;
				default : printf("Erreur !\n");
			}
			fwrite(str,(int)strlen(str),1,fp);
			nb=0;
			while(nb!=1 && nb!=2 && nb!=3)
			{
				printf("Choisissez la difficulte : 1- Easy / 2- Medium / 3- Hard\n");
				scanf("%d",&nb);
				getchar();	
			}
			switch(nb)
			{
				case 1 : strcpy(str,"Easy;\r\n");
					 break;
				case 2 : strcpy(str,"Medium;\r\n");
					 break;
				case 3 : strcpy(str,"Hard;\r\n");
					 break;
				default : printf("Erreur !\n");
			}
			fwrite(str,(int)strlen(str),1,fp);
			FermerFichier(fp);
		}
	}
	return retour;
}

/*************************************************************************
**  [ReinitConfigDefaut]                                                **
**  Permet de supprimer le clone du fichier de faits et de remettre     **
**  la config par defaut                                                **
**                                                                      **
**      Entrees : /                                                     **
**                                                                      **
**      Sorties : INT                                                   **
**                0 = echec                                             **
**                1 = succes                                            **
**                                                                      **
**************************************************************************/
int ReinitConfigDefaut(void)
{
	int retour;
	
	retour=ClonnageFaits('S');
	if (retour==1)
		return 1;
	else
		return 0;
}

/*************************************************************************
**  [ClonnageFaits]                                                     **
**  Permet de cloner le fichier de faits pour modifier la config tout   **
**  en gardant quelquepart (le clone) la config par defaut              **
**                                                                      **
**      Entrees : CHAR                                                  **
**                'C' pour clonner le fichier                           **
**                'S' pour supprimer le clone                           **
**                                                                      **
**      Sorties : INT                                                   **
**                0 = echec                                             **
**                1 = succes                                            **
**                                                                      **
**************************************************************************/
int ClonnageFaits(char indic)
{
	if(indic=='C' || indic=='c')
	{
		if(!(system("cp Faits Faits.SAVE 2> /dev/null")))
			return 1; //copie cree
			
		return 0; //erreur
	}
	else if(indic=='S' || indic=='s')
	{
		if(!(system("rm Faits 2> /dev/null")) && !(system("mv Faits.SAVE Faits 2> /dev/null")))
			return 1; //suppression reussie
		
		return 0; //erreur
	}
	return 0;
}

/*************************************************************************
**  [ConfigFailSolver]                                                  **
**  Cette fonction est une fonction de secours qui permet en cas d'     **
**  erreur dans la config de pouvoir revenir a un fichier de faits      **
**  correct/pre-configure ou d'en recreer un s'il n'existe pas          **
**                                                                      **
**      Entrees : CHAR                                                  **
**                'C' pour (re)créer un fic. de faits predefini s'il    **
**                    n'existe pas                                      **
**                'R' pour reinitialiser la config par defaut           **
**                                                                      **
**      Sorties : /                                                     **
**                                                                      **
**************************************************************************/
void ConfigFailSolver(char indic)
{
	FILE *fp=NULL;
	char str[MAXSIZE];
	
	if(indic=='C' || indic=='c')
	{
		fp=OuvrirFic("Faits","w+");
		   memset(str,0,MAXSIZE*sizeof(char));
		   strcpy(str,"Nb_J1;\r\n");
		   fwrite(str,(int)strlen(str),1,fp);
		   strcpy(str,"Nb_IA3;\r\n");
		   fwrite(str,(int)strlen(str),1,fp);
		   strcpy(str,"Medium;\r\n");
		   fwrite(str,(int)strlen(str),1,fp);
		FermerFichier(fp);
	}
	else if(indic=='R' || indic=='r')
	{
		if((!(remove("Faits"))&&!(remove("Faits.SAVE"))) || !(remove("Faits")) || !(remove("Faits.SAVE")))
		{
			// suppression reussie
			if((fp=OuvrirFic("Faits","w+")))
			{
				memset(str,0,MAXSIZE*sizeof(char));
				strcpy(str,"Nb_J1;\r\n");
				fwrite(str,(int)strlen(str),1,fp);
				strcpy(str,"Nb_IA3;\r\n");
				fwrite(str,(int)strlen(str),1,fp);
				strcpy(str,"Medium;\r\n");
				fwrite(str,(int)strlen(str),1,fp);
				FermerFichier(fp);
			}
		}
		else
		{
			printf("Impossible de rétablir la config par defaut...\n");
			printf("Consultez la documentation ou adressez vous aux developpeurs de cette application\n");
		}
	}
}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/



//Menu
char menu(void)
{
	char choix;
	printf("\n-------- MENU -------\n");
	printf("(1) - Config\n");
	printf("(2) - Tester Fonction\n");
	printf("(0) - Quitter\n");
	printf("\n> ");
	scanf("%c", &choix);
	getchar();
	return choix;
}

//Ouverture de fichiers 
FILE* OuvrirFic(char* NomFic,char* mode)
{
	FILE* f=NULL;
	if ((f = fopen(NomFic, mode)) == NULL)
	{
		printf("Erreur d'ouverture du fichier %s !\n",NomFic);
		return NULL;
		//exit(qqch) ??
	}
	else
		return f;
}

//Fermeture fichiers
void FermerFichier(FILE* fp)
{
	if(fclose(fp))
		printf("Erreur fermeture\n");	
}
